/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package EnderecoEstoque;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;
import util.ErroAcessoRepositorioException;

/**
 *
 * @author Tulio José
 * @author Alberto Medeiros
 */
public class RepositorioEnderecoEstoque implements IRepositorioEnderecoEstoque {

    /**
     * Mensagem que indica erro de acesso ao banco de dados.
     */
    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";

    public RepositorioEnderecoEstoque() throws ErroAcessoRepositorioException {
    }

    /**
     * Metodo que ira cadastrar/atualizar os objetos EnderecoEstoque
     * 
     * @param objEnderecoEstoque
     * @throws ErroAcessoRepositorioException 
     */
    public void cadastrarAtualizar(EnderecoEstoque objEnderecoEstoque) throws ErroAcessoRepositorioException {

        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            
            s.saveOrUpdate(objEnderecoEstoque);
            
            t.commit();
            
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
    }

    /**
     * Método que ira procurar um determinado objeto EnderecoEstoque na base pelo seu Id
     * 
     * @param idEnderecoEstoque
     * @throws EnderecoEstoqueNaoCadastradoException
     * @throws ErroAcessoRepositorioException 
     * @return EnderecoEstoque
     */
    public EnderecoEstoque procurar(int idEnderecoEstoque) throws ErroAcessoRepositorioException, EnderecoEstoqueNaoCadastradoException {

        EnderecoEstoque objEnderecoEstoque = null;

        if (this.existe(idEnderecoEstoque)) {
            Session s = null;
            Transaction t = null;
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
                objEnderecoEstoque = (EnderecoEstoque) s.get(EnderecoEstoque.class, idEnderecoEstoque);
                t.commit();
            } catch (Exception e) {
                t.rollback();
                throw new EnderecoEstoqueNaoCadastradoException();
            }
        } else {
            throw new EnderecoEstoqueNaoCadastradoException("Endereço Não Cadastrado");
        }
        return objEnderecoEstoque;
    }

    /**
     * Método que ira verificar a existência da um objeto EnderecoEstoque
     * @param idEnderecoEstoque
     * @throws ErroAcessoRepositorioException 
     * @return boolean
     */
    public boolean existe(int idEnderecoEstoque) throws ErroAcessoRepositorioException {

        EnderecoEstoque objEnderecoEstoque = null;
        Session s = null;
        Transaction t = null;

        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            //salvando produto no bando de dados
            objEnderecoEstoque = (EnderecoEstoque) s.get(EnderecoEstoque.class, idEnderecoEstoque);
            t.commit();
        } catch (Exception e) {
            t.rollback();
        }
        return (objEnderecoEstoque != null);
    }

    /**
     * Método que ira listar os objetos Endereco Estoque na case
     * 
     * @return List<EnderecoEstoque>
     * @throws Exception
     * @throws ErroAcessoRepositorioException 
     */
    public List<EnderecoEstoque> listar(String strComplemento) throws Exception, ErroAcessoRepositorioException {
        List<EnderecoEstoque> listEnderecoEstoque = null;
        Session s = null;
        Transaction t = null;

        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            Query q = s.createQuery("from EnderecoEstoque WHERE id_endereco IS NOT NULL " + strComplemento);
            listEnderecoEstoque = q.list();
            t.commit();
        } catch (Exception e) {
            t.rollback();
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }
        return listEnderecoEstoque;
    }

    /**
     * Método que ira remover um objeto EnderecoEstoque da base
     * 
     * @param idEnderecoEstoque
     * @throws EnderecoEstoqueNaoCadastradoException
     * @throws ErroAcessoRepositorioException 
     */
    public void remover(int idEnderecoEstoque) throws EnderecoEstoqueNaoCadastradoException, ErroAcessoRepositorioException {
        EnderecoEstoque objEnderecoEstoque = null;
        if (this.existe(idEnderecoEstoque)) {
            Session s = null;
            Transaction t = null;
            try {
                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = s.beginTransaction();
                //recuperando a descrição do produto
                objEnderecoEstoque = (EnderecoEstoque) s.get(EnderecoEstoque.class, idEnderecoEstoque);
                //setar o id como excluido
                objEnderecoEstoque.setStatusEnderecoEstoque(false);
                // Comitando
                t.commit();
                
                //atualizo ele para excluido
                this.cadastrarAtualizar(objEnderecoEstoque);
               
            } catch (Exception e) {
                t.rollback();
                throw new EnderecoEstoqueNaoCadastradoException();
            }
        }
    }
}
